package com.stone.design.mode.iterator;

import java.util.List;

/**
 * 真实迭代器
 *
 * @author Mr_wenpan@163.com 2022/01/16 13:37
 */
public class ConcreteIterator<T> implements Iterator<T> {

    /**
     * 存放迭代器数据的容器（这里可以是list、set、vector等各种容器，看自己定义）
     */
    private final List<T> container;

    /**
     * 定义当前游标
     */
    public int cursor = 0;

    /**
     * 构造方法，迭代器必须要用一个容器来初始化，因为迭代器迭代的是容器内部的元素
     */
    public ConcreteIterator(List<T> container) {
        this.container = container;
    }

    @Override
    public T next() {
        if (hasNext()) {
            // 获取游标处的元素
            return container.get(cursor++);
        }
        // 游标已经到达容器尾部了，则直接返回null
        return null;
    }

    @Override
    public boolean hasNext() {
        // 如果游标达到容器尾部，则说明已经没有下一个元素了
        return cursor != container.size();
    }

    @Override
    public boolean remove() {
        // 从容器中移除当前游标处的元素（这会影响原来的容器内的元素数量，如果要实现不影响，那么在构造函数中可以使用容器拷贝，拷贝一个新的容器）
        container.remove(cursor);
        return true;
    }
}
